]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
ui/main: Allow not inhibiting animations sometimes
authorJonas Ådahl <jadahl@gmail.com>
Tue, 29 Nov 2022 15:33:34 +0000 (16:33 +0100)
committerJonas Ådahl <jadahl@gmail.com>
Tue, 29 Nov 2022 16:52:56 +0000 (17:52 +0100)
When we're running in e.g. CI, or in a virtual machine without hardware
acceleration, and we actually want to enable animations despite the
potential performance implications, change the AnimationsSettings to
only inhibit if we're a XVNC instance or not hardware accelerated if
--force-animations wasn't passed.

Still inhibit animations if there is a remote desktop session that
explicitly disables animations.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2560>

js/ui/main.js

index b6f54da9eb49247d6e273505e5a2635ef76a1090..ad9470bf83c39f3da986baee73d2c9cbfd853a3b 100644 (file)
@@ -919,43 +919,62 @@ function showRestartMessage(message) {
 
 var AnimationsSettings = class {
     constructor() {
-        let backend = global.backend;
-        if (!backend.is_rendering_hardware_accelerated()) {
-            St.Settings.get().inhibit_animations();
-            return;
-        }
+        this._animationsEnabled = true;
+        this._handles = new Set();
 
-        let isXvnc = Shell.util_has_x11_display_extension(
-            global.display, 'VNC-EXTENSION');
-        if (isXvnc) {
-            St.Settings.get().inhibit_animations();
-            return;
+        global.connect('notify::force-animations',
+            this._syncAnimationsEnabled.bind(this));
+        this._syncAnimationsEnabled();
+
+        const backend = global.backend;
+        const remoteAccessController = backend.get_remote_access_controller();
+        if (remoteAccessController) {
+            remoteAccessController.connect('new-handle',
+                (_, handle) => this._onNewRemoteAccessHandle(handle));
         }
+    }
+
+    _shouldEnableAnimations() {
+        if (this._handles.size > 0)
+            return false;
 
-        let remoteAccessController = backend.get_remote_access_controller();
-        if (!remoteAccessController)
+        if (global.force_animations)
+            return true;
+
+        const backend = global.backend;
+        if (!backend.is_rendering_hardware_accelerated())
+            return false;
+
+        if (Shell.util_has_x11_display_extension(
+            global.display, 'VNC-EXTENSION'))
+            return false;
+
+        return true;
+    }
+
+    _syncAnimationsEnabled() {
+        const shouldEnableAnimations = this._shouldEnableAnimations();
+        if (this._animationsEnabled === shouldEnableAnimations)
             return;
 
-        this._handles = new Set();
-        remoteAccessController.connect('new-handle',
-            (_, handle) => this._onNewRemoteAccessHandle(handle));
+        const settings = St.Settings.get();
+        if (shouldEnableAnimations)
+            settings.uninhibit_animations();
+        else
+            settings.inhibit_animations();
     }
 
     _onRemoteAccessHandleStopped(handle) {
-        let settings = St.Settings.get();
-
-        settings.uninhibit_animations();
         this._handles.delete(handle);
+        this._syncAnimationsEnabled();
     }
 
     _onNewRemoteAccessHandle(handle) {
         if (!handle.get_disable_animations())
             return;
 
-        let settings = St.Settings.get();
-
-        settings.inhibit_animations();
         this._handles.add(handle);
+        this._syncAnimationsEnabled();
         handle.connect('stopped', this._onRemoteAccessHandleStopped.bind(this));
     }
 };